import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;

public class KuoHaoPanDuan {
    public static void main(String[] args) {
        String a = "[{()}]";
        boolean valid = isValid(a);
        System.out.println(valid);
    }

    public static boolean isValid(String s) {
        if (s.length() % 2 == 1) { // 字符串的长度如果为奇数，必缺失一个括号，({[})长度为5,必不合题
            return false;
        }
        HashMap<Character, Character> hashmap = new HashMap<>(); // 创建哈希表
        hashmap.put(')','('); // 键key为右括号，值value为左括号
        hashmap.put('}','{');
        hashmap.put(']','[');

        Deque<Character> stack = new LinkedList<>(); // 创建链表
        for (int i=0; i<s.length(); i++){
            char ch = s.charAt(i); // 从字符串的第一个字符开始取
            if (hashmap.containsKey(ch)) { // 哈希表中存在提供的字符串的某一个字符
                if (stack.isEmpty() || stack.peek() != hashmap.get(ch)) { // 如果栈为空或者在栈顶的值不为哈希表中键ch对应的左括号
                    return false;
                }
                stack.pop(); // 栈弹出括号
            }else {
                stack.push(ch); // 推入数据
            }
        }
        return stack.isEmpty(); // 返回栈是否为空

    }
}
